package dt.inlee.common.dao.ifc;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;

import org.hibernate.LockMode;
import org.springframework.dao.DataAccessException;

import dt.inlee.common.pagination.PageBean;
import dt.inlee.common.pagination.SearchBean;

/**
 * Hibernate 操作模板接口
 * 
 * @param <实体类型>
 * @param <主键类型>
 */
public interface IGenericHibernateDao<T, ID extends Serializable> {

    public void SaveList(T[] listT);

    /**
     * 执行SQL语句
     * 
     * @param sql
     * @return
     */
    public int countBySQL(String sql);

    public double sumBySQL(String sql);

    public boolean execBySQL(String sql);

    public Object exeSQL(String sql);

    public void queryBySQL(String sql, List<String> titles, List<Object[]> queryData);

    public List<T> FindBySQL(String sql);


    public T findClassBSQL(String sql);

    /**
     * 
     * @param sql sql语句
     * @param params 参数列表
     * @return 集合List
     */
    public List<T> FindBySQL(String sql, Object[] params);

    /**
     * 是否包含该实体信息
     * 
     * @param 实体对象
     * @return TRUE: 包含 FALSE:不包含
     * @throws DataAccessException
     */
    public boolean contains(T t);

    /**
     * 根据复合条件查询数据量
     * 
     * @param 条件和排序查询对象
     * @return 数据量
     * @throws EXCEPTION
     */
    public int count(SearchBean parmas);

    /**
     * 根据ID删除实体对象
     * 
     * @param ID
     * @throws EXCEPTION
     */
    public void delete(ID id);

    /**
     * 根据ID删除实体对象并加锁
     * 
     * @param ID
     * @param 锁模式
     * @throws EXCEPTION
     */
    public void delete(ID id, LockMode lockMode);

    /**
     * 删除实体对象
     * 
     * @param 实体对象
     * @throws EXCEPTION
     */
    public void delete(T t);

    /**
     * 删除实体对象并加锁
     * 
     * @param 实体对象
     * @param 锁类型
     * @throws EXCEPTION
     */
    public void delete(T t, LockMode lockMode);

    /**
     * 删除实体对象集合
     * 
     * @param 实体对象集合
     * @throws EXCEPTION
     */
    public void deleteAll(Collection<T> entities);

    /**
     * 根据ID集合删除实体对象集合
     * 
     * @param 实体对象集合
     * @throws EXCEPTION
     */
    public void deleteAll(String field, ID[] ids);

    /**
     * 使用条件和排序查询对象检索数据
     * 
     * @param 条件和排序查询对象
     * @return 实体对象集合
     * @throws EXCEPTION
     */
    public List<T> find(SearchBean params);

    /**
     * 使用HQL语句检索数据
     * 
     * @param HQL语句
     * @return 实体对象集合
     * @throws EXCEPTION
     */
    public List<T> find(String queryString);

    /**
     * 使用带单个参数的HQL语句检索数据
     * 
     * @param HQL语句
     * @param 参数值
     * @return 实体对象集合
     * @throws EXCEPTION
     */
    public List<T> find(String queryString, Object value);

    /**
     * 使用带多个参数的HQL语句检索数据
     * 
     * @param HQL语句
     * @param 参数值数组
     * @return 实体对象集合
     * @throws EXCEPTION
     */
    public List<T> find(String queryString, Object[] values);

    /**
     * 使用命名的HQL语句检索数据
     * 
     * @param 命名的HQL语句
     * @return 实体对象集合
     * @throws EXCEPTION
     */
    public List<T> findByNamedQuery(String queryName);

    /**
     * 使用单个参数的命名HQL语句检索数据
     * 
     * @param 命名HQL语句
     * @param 参数值
     * @return 实体对象集合
     * @throws EXCEPTION
     */
    public List<T> findByNamedQuery(String queryName, Object value);

    /**
     * 使用带参数的命名HQL语句检索数据
     * 
     * @param 命名HQL语句
     * @param 参数值数组
     * @return 实体对象集合
     * @throws EXCEPTION
     */
    public List<T> findByNamedQuery(String queryName, Object[] values);

    /**
     * 获取实体信息
     * 
     * @param ID
     * @return 实体类
     * @throws EXCEPTION
     */
    public T get(ID id);

    /**
     * 使用条件和排序查询对象获取单个数据
     * 
     * @param 条件和排序查询对象
     * @return 实体对象
     * @throws EXCEPTION
     */
    public T get(SearchBean params);

    /**
     * 获取全部数据
     * 
     * @return 实体对象集合
     * @throws EXCEPTION
     */
    public List<T> list();

    /**
     * 加载实体信息
     * 
     * @param ID
     * @return 实体类
     * @throws EXCEPTION
     */
    public T load(ID id);

    /**
     * 刷新实体数据
     * 
     * @param 实体对象
     * @throws EXCEPTION
     */
    public void refresh(T t);

    /**
     * 刷新实体数据并加锁
     * 
     * @param 实体对象
     * @param 锁类型
     * @throws EXCEPTION
     */
    public void refresh(T t, LockMode lockMode);

    /**
     * 保存实体对象
     * 
     * @param 实体对象
     * @return 主键ID
     * @throws EXCEPTION
     */
    public ID save(T t);

    /**
     * 保存或更新实体对象
     * 
     * @param 实体对象
     * @throws EXCEPTION
     */
    public void saveOrUpdate(T t);

    /**
     * 保存或更新实体对象集合
     * 
     * @param 实体对象集合
     * @throws EXCEPTION
     */
    public void saveOrUpdateAll(Collection<T> entities);

    /**
     * 分页查询
     * 
     * @param 分页实体类
     * @throw Exception
     */
    public void searchByPagination(PageBean pageBean);


    public void SessionFlush();


    /**
     * 更新实体对象集合
     * 
     * @param 实体对象集合
     * @throws EXCEPTION
     */
    public void update(Collection<T> entities);


    /**
     * 更新实体对象
     * 
     * @param 实体对象
     * @throws EXCEPTION
     */
    public void update(T t);

    /**
     * 更新实体对象并加锁
     * 
     * @param 实体对象
     * @param 锁类型
     * @throws EXCEPTION
     */
    public void update(T t, LockMode lockMode);

    /**
     * 获取属于该父ID值的新的ID值，该ID值必须为String类型 <br>
     * 该算法适用于<br>
     * -0<br>
     * |-01<br>
     * |--0101<br>
     * |--0102<br>
     * |-02<br>
     * |--0201<br>
     * 此种树状类型的ID值
     * 
     * @param ID列名
     * @param 父ID列名
     * @param 父ID值
     * @return 返回新的ID值
     * @throws EXCEPTION
     */
    public String getNewID(String colID, String colParentID, String parentID);

    public List<?> findColumn(String queryString, Object value);

    public List<?> findColumn(String queryString);

    /**
     * 
     * @方法名: findAggregation
     * @功能说明: TODO(聚合查询，可查询sum，avg，max，min)
     * @作者: 研发部-鄢松涛
     * @时间: 2014-5-28上午11:23:04
     * @param params 查询条件
     * @param aggparams 查询参数,比如要查两个聚合sum(a),avg(b),则写new String[][]{{"sum","a"},{"avg","b"}}，支持的聚合函数：max,min,sum,avg,注意，，参数错误会导致结果变少，导致出错
     * @return 返回值根据aggparams的顺序取例如上面的例子：返回值则obj[0]为a的sum，obj[b]为avg(b)的值
     */
    public Object[] findAggregation(SearchBean params, String[][] aggparams);

    /**
     * 
     * @方法名: findPacketStatistics
     * @功能说明: TODO(分组统计，可查询sum，avg，max，min,count)
     * @作者: 研发部-鄢松涛
     * @时间: 2014-5-28下午05:05:54
     * @param params 查询条件
     * @param aggparams 查询参数,比如要查两个聚合sum(a),avg(b),则写new String[][]{{"sum","a"},{"avg","b"}}，支持的聚合函数：max,min,sum,avg,注意，，参数错误会导致结果变少，导致出错
     * @param psParams 分组的字段数组
     * @return 返回一个list的Object数组，存储顺序和查询参数相同，先是psParams字段的值，再是aggparams对应的值
     */
    public List<Object[]> findPacketStatistics(SearchBean params, String[][] aggparams, String[] psParams);

    // public void batchSave(T t);

    /**
     * execut sql
     * 
     * @param sql
     */
    public boolean executBySql(String sql);
}
